
/**
 * @file IP.h
 * @brief Fichier d'entête du module IP.
 *
 * @author Mohammad NOROUZZADEH, Lotfi, Saleh
 */
#ifndef _IP_H
#define _IP_H


/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de IP                                */
/*                                                                       */
/* ********************************************************************* */

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>


#include "Date.h"
#include "UE.h"
#include "Etudiant.h"
#include "Chemin.h"
/* ********************************************************************* */
/*                                                                       */
/*                        Définitions de types                           */
/*                                                                       */
/* ********************************************************************* */

/**
 * @struct IP
 * @brief Structure utilisée pour la gestion d'une IP.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct sIP
{
    int codeIp;
    int codeUe;
    int numEtu;
    int  annee;
    char semestre;
    char groupe;
};



/**
 * @typedef IP
 * @brief Redéfinit la structure sIP
 */
typedef struct sIP IP ;

/**
 * @struct sTabIP
 * @brief Structure utilisée pour la gestion d'une IP.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct sTabIP
{
    IP**tabIp;
    int nbIP;
};

/**
 * @typedef TabIP
 * @brief Redéfinit la structure sTabIP
 */
typedef struct  sTabIP  TabIP;

/**
 * @fn void initIP(IP * ip, const UE *ue, const Etu *etu, const Date * annee,const char semestre, const char groupe);
 * @brief Initialise un IP.
   initIP initialise CodeUE, Intitule et Sequence (après vérification) de la structure IP

 * @param[in, out] ue Pointeur vers l'ip à initialiser.
 * @param[in] ue de l'ip.
 * @param[in] etu de l'ip.
 * @param[in] annee de l'ip.
 * @param[in] semestre de l'ip.
 * @param[in] groupe de l'ip.
 * @return 0 si tout est OK
 */
void initIP(IP * ip, const int  codeIp, const int  codeUe, const int numEtu, const int  annee,const char semestre, const char groupe);

/**
 * @fn void libIP(IP * ip);
 * @brief Libere un IP en mémoire.

 * @param[in, out] ue Pointeur vers l'ue.
 * @return 0 si tout est OK
 */
void libIP(IP * ip);

/**
 * @fn IP * creIP(const UE *ue, const Etu *etu, const Date * annee,const char semestre, const char groupe);
 * @brief Crée un IP en mémoire.

 * @param[in] ue de l'ip.
 * @param[in] etu de l'ip.
 * @param[in] annee de l'ip.
 * @param[in] semestre de l'ip.
 * @param[in] groupe de l'ip.
 * @return un pointeur vers un IP
 */
IP * creIP(const int  codeIp,const int codeUe, const int numEtu, const int annee,const char semestre, const char groupe);

/**
 * @fn void detIP(IP ** ip);
 * @brief Détruit un IP en mémoire.

 * @param[in, out] ip Pointeur vers l'ip.
 * @return 0 si tout est OK
 */
void detIP(IP ** ip);

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure IP                 */
/*																		*/
/* ******************************************************************** */

/**
 * @fn UE * getUE_IP(const IP * ip);
 * @brief returner ue de IP.

 * @param[in] ip pointeur vers l'IP.
 * @return ue de IP
 */
int getUE_IP(const IP * ip);

/**
 * @fn void setUE_IP(IP * ip,const UE * ue);
 * @brief modifie le champ ue de l'IP.

 * @param[in, out] ue Pointeur vers l'ip.
 * @param[in] ue de l'IP.
 * @return 0 si tout est OK
 */
void setUE_IP(IP * ip,const int codeUe);

/**
 * @fn Etu * getEtu_IP(const IP * ip);
 * @brief returner etu de l'IP.

 * @param[in] ip Pointeur vers l'ip.
 * @return etu.
 */
int getEtu_IP(const IP * ip);

/**
 * @fn void setEtu_IP(IP * ip,const Etu * etu);
 * @brief modifie le etu de l'IP.

 * @param[in, out] ip Pointeur vers l'IP.
 * @param[in] etu de l'IP.
 * @return 0 si tout est OK.
 */
void setEtu_IP(IP * ip,const int  numEtu);

/**
 * @fn Date * getAnnee_IP(IP * ip);
 * @brief returner Annee.

 * @param[in] ip pointeur vers l'IP.
 * @return annee.
 */
int  getAnnee_IP(const IP * ip);

/**
 * @fn void setAnnee_IP(IP * ip,const Date * annee);
 * @brief modifie le champ annee de l'IP.

 * @param[in, out] ip Pointeur vers l'IP.
 * @param[in] annee de l'ip.
 * @return 0 si tout est OK.
 */
void setAnnee_IP(IP * ip,const int  annee);

/**
 * @fn char getSemestre(const IP * ip);
 * @brief returner semestre.

 * @param[in] ip pointeur vers l'IP.
 * @return semestre.
 */
char getSemestre(const IP * ip);

/**
 * @fn void setSemestre(IP * ip,const char semestre);
 * @brief modifie le champ semestre de l'IP.

 * @param[in, out] ip Pointeur vers l'IP.
 * @param[in] semestre de l'ip.
 * @return 0 si tout est OK.
 */
void setSemestre(IP * ip,const char semestre);

/**
 * @fn char getGroupe(const IP * ip);
 * @brief returner groupe.

 * @param[in] ip pointeur vers l'IP.
 * @return groupe.
 */
char getGroupe(const IP * ip);

/**
 * @fn void setGroupe(IP * ip,const char groupe);
 * @brief modifie le champ groupe de l'IP.

 * @param[in, out] ip Pointeur vers l'IP.
 * @param[in] groupe de l'ip.
 * @return 0 si tout est OK.
 */
void setGroupe(IP * ip,const char groupe);

/**
 * @fn void affIP(const IP * ip);
 * @brief Afficher l'ip.

 * @param[in] ip pointeur vers l'IP.
 * @return 0 si tout est OK
 */
void affIP(const IP * ip);

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'Etu                       */
/*                                                                       */
/* ********************************************************************* */

/**
 * @fn void savIPParElem(const UE * ue,const Etu * etu,const Date * annee, const char semestre,
                         const char groupe);
 * @brief saover IP dans un fichier binaire.
 *
 * @param[in] ue .
 * @param[in] etu .
 * @param[in] annee .
 * @param[in] semestre.
 * @param[in] groupe.

 * @return 0 si tout est OK.
 */
void savIPParElem(const int  codeIp,const int  codeUe,const int  numEtu,const int  annee,
                  const char semestre, const char groupe);


/**
 * @fn void  saveIp(IP*ip);
 * @brief saover IP dans un fichier binaire.
 *
 * @param[in] ip .

 * @return 0 si tout est OK.
 */
void  saveIp(IP*ip);

/**
 * @fn int rchIPParCode(const int codeEtu, const int codeUE);
 * @brief recherche IP dans un fichier binaire.
 *
 * @param[in] numEtu .
 * @param[in] codeUE .

 * @return 0 s'il n'existe pas.
 * @return 1 s'il existe.
 */
IP* rchIPParCode(const int  codeIp);

/**
 * @fn IP *recIPParCode(const int codeEtu, const int codeUE);
 * @brief recupérer Etu dans un fichier binaire.
 *
 * @param[in] numEtu .
 * @param[in] codeUE .

 * @return Etu s'il n'existe pas.
 * @return NULL s'il existe.
*/

IP* recIpParCodeUeNumEtu(int  numEtu,int  codeUe);

/**
 * @fn int supIPParCode(const int numEtu, const int codeUE);
 * @brief supprimer Etu dans un fichier binaire.
 *
 * @param[in] numEtu .
 * @param[in] codeUE .

 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int modifierIp(IP*ip,IP*ipnew);

/**
 * @fn int definitAutomatiquementGroupe(UE*ue,int  nbGroupe);
 * @brief definitAutomatiquementGroupe.
 *
 * @param[in] ue.
 * @param[in] nbGroupe .

 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int definitAutomatiquementGroupe(UE*ue,int  nbGroupe);

/**
 * @fn void setCodeIp(IP*ip,const int codeIp);
 * @brief setCodeIp
 *
 * @param[in] ip.
 * @param[in] newip .

 * @return 0 si tout est bien.
 */
void setCodeIp(IP*ip,const int codeIp);

/**
 * @fn TabIP* rchIPParUe(UE*ue);
 * @brief recherche IPParUe
 *
 * @param[in] ue.

 * @return Etu  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabIP * rchIPParUe(UE*ue);

/**
 * @fn TabIP * rchIPParCodeUe(const int codeUE);
 * @brief recherche rchIPParCodeUe
 *
 * @param[in] codeUE .

 * @return Etu  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabIP * rchIPParCodeUe(const int codeUE);

/**
 * @fn TabEtu * recEtuInscritParCodeUe(int codeUe);
 * @brief recuperer EtuInscritParCodeUe
 *
 * @param[in] codeUE .

 * @return Etu  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabEtu * recEtuInscritParCodeUe(int codeUe);

/**
 * @fn TabEtu * recEtuInscritParUe(UE*ue);
 * @brief recuperer EtuInscritParUe
 *
 * @param[in] ue.

 * @return Etu  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabEtu * recEtuInscritParUe(UE*ue);

/**
 * @fn TabIP* recIpParNumEtudiant(int numEtu);
 * @brief recuperer recIpParNumEtudiant
 *
 * @param[in] numetu.

 * @return tabEtu  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabIP * recIpParNumEtudiant(int numEtu);

/**
 * @fn TabIP* recIpParEtudiant(Etu* etu);
 * @brief recuperer recIpParEtudiant
 *
 * @param[in] etu.

 * @return tabIP  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabIP * recIpParEtudiant(Etu* etu);

/**
 * @fn TabUe *  recUeParEtu(Etu*etu);
 * @brief recuperer UeParEtu
 *
 * @param[in] etu.

 * @return tabUE  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabUe *  recUeParEtu(Etu*etu);

/**
 * @fn TabUe* recUeParNumEtu(int  numEtu);
 * @brief recuperer UeParNumEtu
 *
 * @param[in] numetu.

 * @return tabUE  s'il existe.
 * @return NULLs'il n'existe pas.
*/
TabUe* recUeParNumEtu(int  numEtu);


/**
 * @fn UE* recUeParIp(IP*ip);
 * @brief recuperer UeParIp
 *
 * @param[in] ip.

 * @return tabUE  s'il existe.
 * @return NULLs'il n'existe pas.
*/
UE* recUeParIp(IP*ip);

/**
 * @fn int supIp(IP*ip);
 * @brief supprimer IP.
 *
 * @param[in] ip.

 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int supIp(IP*ip);

/**
 * @fn int supprimeIPParCode(int codeIp);
 * @brief supprimeIPParCode.
 *
 * @param[in] ip.

 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int supprimeIPParCode(int codeIp);

/**
 * @fn int supprimeIPParNumEtuUE(int numEtu,int codeUe );
 * @brief supprimeIPParCode.
 *
 * @param[in] numetu.
 * @param[in] codeUe.

 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int supprimeIPParNumEtuUE(int numEtu,int codeUe );

/**
 * @fn int getNewCodeIp();
 * @brief int preduire NewCodeIp.
 *
 * @return un nombre.
 */
int getNewCodeIp();


/**
 * @fn void  detTabIp(TabIP**tabIp);
 * @brief int detruire tab ip.
 *
 * @param[in] tabip.

 * @return 0 si touit va bien.
 */
void  detTabIp(TabIP**tabIp);


/**
 * @fn affIP_DB();
 * @brief Afficher base de donnee de IP .

 * @return 0 si tout est OK.
 */
void affIP_DB();

/**
 * @fn void regIP() ;
 * @brief Test le module IP
 */
void regIP();

#endif
